package threadlocal;

/**
 * @Classname ThreadLocalExample
 * @Description initialValue()方法的例子
 * @Date 2024/1/14 21:54
 * @Author zhuzhenguo
 */
public class ThreadLocalExample {
    private static ThreadLocal<String> threadLocal = new ThreadLocal<String>() {
        /**
         * 先对 ThreadLocal 变量调用了 set() 方法设置了一个值，那么在当前线程中再次调用 get() 方法时，
         * initialValue() 方法就不会被调用了，因为 initialValue() 方法的调用是懒加载的，只有在第一次调用 get() 方法时，
         * 如果没有之前的 set() 调用，才会被触发。
         *
         * @return {@link String}
         */
        @Override
        protected String initialValue() {
            return "Initial Value";
        }
    };

    public static void main(String[] args) {
        // 设置一个新值
        threadLocal.set("New Value");

        // 获取当前线程中的ThreadLocal值
        String value = threadLocal.get();
        System.out.println(value); // 输出 "New Value"，而不是 "Initial Value"

        // 移除当前线程中的ThreadLocal值
        threadLocal.remove();

        // 再次获取，这时会调用initialValue()方法来初始化值
        value = threadLocal.get();
        System.out.println(value); // 输出 "Initial Value"
    }
}
